데이터 과학을 위한 파이썬

Intro

이번 장에서는 pandas,matplotlib, seaborn 패키지를 활용하여 데이터를 시각화하는 기본적인 방법들을 다룹니다. 먼저 씨본의 다양한 플롯과 차트들을 다룬 후, 맷플롯의 기능들을 공부하도록 하겠습니다. 사실 씨본은 맷플롯을 기반으로 만들어진 패키지입니다. 하지만 씨본이 더 쉽고 직관적인 인터페이스를 제공하기 때문에 씨본을 먼저 다룬 이후 맷플롯을 다루도록 하겠습니다.

먼저 matplotlib, seaborn, pandas 패키지를 불러옵니다. plt, sns, pd 라는 별칭은 파이썬 코딩 관례이므로 반드시 지킬 필요는 없지만, 존중하는 편이 좋습니다. 다음으로 실습용 갭마인더 데이터를 읽어옵니다. 갭마인더 데이터는 국가별, 연도별 기대수명/인구수/1인당GDP 등을 기록한 데이터입니다.

1. 기본적인 시각화: seaborn

이 글에서 다룰 플롯 함수들은 다음과 같습니다. seaborn 함수들의 전체 목록은 seaborn API 레퍼런스를 참고하시기 바랍니다.

  • sns.distplot: 밀도 그래프
  • sns.barplot: 막대 그래프
  • sns.boxplot & sns.violinplot: 박스플롯, 바이올린플롯
  • sns.lineplot: 선 그래프
  • sns.scatterplot & sns.pairplot: 산점도, 페어플롯
  • sns.heatmap: 히트맵

지금부터 다룰 시각화는 모두 판다스의 시리즈와 데이터프레임을 활용합니다. 즉 기본적으로 판다스 시리즈와 데이터프레임을 다룰 능력이 있어야 배운 내용을 제대로 활용할 수 있습니다. 이번 장에서도 판다스 데이터에 대한 조작 과정은 가능한 자세히 설명할 것입니다. 시각화 코드를 따라가는 것도 중요하지만, 판다스로 데이터를 조작하는 과정들도 유심히 살펴보시기 바랍니다!

1.1. distplot

sns.distplot 함수는 1차원 데이터를 받아 밀도 그래프를 그립니다. 판다스 데이터프레임의 컬럼 하나는 1차원의 배열이므로 즉시 밀도 그래프를 그릴 수 있습니다. 아래는 갭마인더 데이터로 그린 2007년 기준 기대수명 밀도 그래프입니다. gapminder 데이터프레임에서 2007년 데이터만 선택한 후, lifeExp 컬럼을 선택합니다. 이 결과를 sns.distplot 함수에 넣어주면 밀도 그래프가 생성됩니다.

distplot의 인자들

distplot의 인자 내용/기능
a 리스트, 넘파이 어레이, 판다스 시리즈 등 데이터
bins 히스토그램 막대 갯수(구간의 크기)를 결정
hist False이면 히스토그램을 생략
kde False이면 kde를 생략
rug True이면 러그플롯을 함께 그림

예제 1.1 2002년 gdpPercap 변수의 밀도 그래프를 그려보세요.

풀이

1) 2002년을 기준으로 데이터를 필터링, 2) gdpPercap 변수를 선택, 3) sns.distplot() 함수에 전달하면 됩니다. 필터링 및 컬럼 선택 과정은 본문 본문에서 했던 과정과 완전히 동일합니다. 이 데이터를 sns.distplot 에 집어넣어주면 끝입니다.

1.2. barplot

sns.barplot은 막대 그래프를 그리는 함수입니다. 막대 그래프를 그리기 위해서는 xy가 필요하며, 씨본의 함수에 xy를 전달하는 코드 패턴은 다음과 같습니다. boxplot, lineplot, scatterplotxy 두 개의 변수를 받는 씨본 플롯에서 계속 사용하게 되는 구조이므로 눈에 잘 익혀두시기 바랍니다.

sns.barplot(x = x변수명, y = y변수명, data = 데이터프레임)

데이터를 잘 조작하였다면 이후의 과정은 쉽습니다. sns.barplot 함수에 만들어놓은 tmp 데이터를 전달하고, x 변수를 "continent"로, y 변수를 "lifeExp" 변수로 지정하였습니다.

barplot의 인자들

인자 내용/기능
hue 그룹별로 색을 구분합니다
dodge True이면 hue 인자에 의한 구분을 쌓아올려서 하나의 막대로, False이면 분리해서 여러 막대로 표현
orient 막대 그래프의 방향을 지정합니다(“v”, “h”). horizontal 플롯을 그릴 때는 x, y축을 알맞게 바꿔줘야 합니다
order 범주형 변수들의 순서를 지정합니다
hueoreder hue 변수의 순서를 지정합니다

hue는 씨본을 활용하면서 계속해서 마주치게 될 인자입니다. hue는 2차원 평면에서 색을 통해 하나의 변수를 추가적으로 표현할 수 있게 해줍니다. 아래 예시 코드를 보겠습니다.

위와 같이 조작한 데이터를 가지고 대륙별 기대 수명을 나타내는 막대 그래프를 그립니다. 역시 데이터 조작 과정만 이해하면 그 후는 어렵지 않습니다. x, y에는 각각 "continent", "lifeExp"를 전달하고, hue 인자에 "year"를 전달하여 1957년과 2007년의 기대수명을 비교할 수 있도록 하였습니다.

예제 1.2. 2007년 gapminder 데이터에서 1인당 GDP 상위 10개 국가를 추출하고 막대 그래프로 시각화하세요. 조건은 다음과 같습니다.

- x축이 1인당 GDP, y축이 국가입니다. 즉 horizontal barplot 을 그려야 합니다.

- 막대의 색은 대륙별로 구분해야 합니다.

- 1인당 GDP가 높은국가부터 낮은 국가 순으로 막대를 정렬해야 합니다.

풀이

먼저 조건에 맞는 데이터프레임을 만들어줍니다.

위처럼 데이터프레임을 미리 정렬해놓았다면, 3번 조건에 대해서는 신경쓸 필요가 없습니다. 여기까지의 과정을 이해했다면 다음부터는 어렵지 않을 것입니다. 수평으로 막대 그래프를 그릴 것이므로 x 변수에는 gdpPercap, y 변수에는 country를 전달합니다. hue 인자에는 continent를 지정하여 대륙별로 막대의 색깔이 달라지도록 합니다. 막대 간 간격을 맞추기 위해 dodge=False 로 지정합니다. 마지막으로 orient 인자에는 'h'를 전달하여 수평으로 그래프가 그려지도록 합니다.

1.3. boxplot & violinplot

sns.boxplot은 말 그대로 박스플롯을 그리는 함수입니다. sns.violinplot은 박스플롯의 기능에 더해 분포를 좀 더 명확하게 확인할 수 있는 플롯입니다.

boxplot의 인자들

인자 내용/기능
hue 그룹별로 색을 구분합니다
orient 막대 그래프의 방향을 지정합니다(“v”, “h”). horizontal 플롯을 그릴 때는 x, y축을 알맞게 바꿔줘야 합니다
order 범주형 변수들의 순서를 지정합니다
hueoreder hue 변수의 순서를 지정합니다

예제 1.3. 1957, 2007년 아시아와 유럽의 1인당 GDP를 박스플롯으로 비교하세요. 다음과 같이 그려주시면 됩니다.

풀이

먼저 조건에 맞는 데이터를 선택해야 합니다. 연도는 1957 또는 2007년이고 대륙은 아시아 또는 유럽입니다. 판다스 시리즈의 isin 메소드를 활용하여 데이터프레임을 필터링해줍니다.

이 결과를 박스플롯으로 그려주기만 하면 됩니다. x축에는 연도, y축에는 1인당 GDP가 들어갔습니다. 색은 대륙별로 구분하였습니다. 따라서 x, y, hue 에 각각 'year', 'gdpPercap', 'continent' 를 전달해주면 됩니다.

1.4. lineplot & pointplot

lineplot은 선 그래프를 그리는 함수입니다. 선 그래프를 그릴 때에도 x와 y가 필요하기 때문에, 바플롯이나 박스플롯을 그릴 때와 같은 코드 패턴을 사용합니다. pointplotlineplot과 유사하지만 데이터 포인트까지 플롯에 표현합니다. 라인플롯과 거의 똑같이 활용할 수 있으며, 포인트의 개수가 많지 않다면 라인플롯보다 유용한 경우가 많습니다.

lineplot의 인자들

인자 내용/기능
hue 그룹별로 색을 구분합니다

바플롯에서 다루었던 hue와 같습니다. 간단한 예시만 살펴보겠습니다. 연도에 따라서 남한과 북한의 1인당 GDP를 비교한 그래프입니다. 역시 데이터를 필터링하는 코드만 이해한다면 크게 어려울 것은 없습니다.

예제 1.4. 1952년 ~ 2007년까지 대륙별 인구 수 추이를 pointplot으로 그리고 대륙별로 색을 구분하세요.

풀이

우선 연도별, 대륙별 인구수 합계를 구해야 합니다. groupy 메소드에 sum 메소드를 연결해서 사용하면 쉽게 구현할 수 있습니다. 이렇게 만들어진 데이터프레임으로 포인트플롯을 그려주고, hue"continent"를 전달해서 대륙별로 색을 구분해주면 됩니다.

1.5. scatterplot & pairplot

sns.scatterplot 은 산점도를 그리는 함수입니다. 산점도를 그리기 위해서는 역시 x축과 y축에 대응하는 변수들이 필요하고, 지금까지와 같이 sns.scatterplot(data = data, x = x변수, y = y변수) 패턴으로 플롯을 그릴 수 있습니다. 아래 예시 코드를 보겠습니다. 2007년 개별 국가들의 1인당 GDP와 기대 수명을 산점도로 나타냈습니다. 크게 어려운 것은 없습니다.

scattertplot의 인자들

인자 내용/기능
hue 그룹별로 마커의 색이 달라집니다
style 그룹별로 마커의 모양이 달라집니다
size 주어진 값에 따라 마커의 크기가 달라집니다

hue는 지금까지 사용했던 hue와 같은 기능이고, style 역시 hue와 유사한 기능을 하는 인자입니다. size는 주어진 값에 따라 마커의 크기를 다르게 표시합니다. 아래 예시 코드를 보겠습니다. 위의 산점도와 거의 유사하지만, 대륙별로 색을 구분하고, 인구 수에 따라 마커의 크기가 달라지도록 했습니다.

예제 1.5. 1997년 아시아 대륙의 1인당 GDP, 기대수명을 산점도로 나타내고 대한민국을 구분된 색으로 표시하세요

풀이

데이터프레임을 잘 조작하기만 하면 쉽게 풀 수 있는 문제입니다. 우선 갭마인더 데이터프레임에서 1997년, 아시아 대륙만을 선택해야 합니다. 두 개의 조건을 걸어서 필터링해주면 1997년 아시아 대륙의 데이터만을 걸러낼 수 있습니다. 이제 다른 국가들로부터 대한민국을 식별할 수 있는 컬럼을 생성해야 합니다. assign 메소드를 활용하여 isKor 컬럼을 생성합니다. isKor 컬럼은 country 컬럼이 "Korea, Rep."일 경우 True이고, 아니면 False가 됩니다. 이 컬럼을 hue로 활용하여 플롯을 그리면 대한민국만을 다른 색으로 표시할 수 있습니다.

sns.scatterplot 이 두 변수를 활용하여 산점도를 그린다면, sns.pairplot은 여러 개의 변수 쌍을 활용하여 산점도를 그립니다. pairplot은 연속형 변수들 간의 상관관계를 파악하는데 유용합니다.

## <seaborn.axisgrid.PairGrid object at 0x000000002EC04D88>

1.6. heatmap

sns.heatmap은 히트맵을 그리는 함수입니다. 히트맵은 상관계수를 시각화하는 경우에 자주 사용됩니다. 아래 예시 코드를 보겠습니다. 먼저 데이터프레임의 corr 메소드를 사용하여 변수들 간의 상관관계를 구합니다. 연도를 2007년으로 고정하였으므로 year 변수와 다른 변수들과의 상관계수는 NaN입니다. 이렇게 만들어진 상관계수 테이블을 sns.heatmap 함수에 집어넣기만 하면 됩니다. annot=True 는 히트맵에 값을 직접 표시하는 기능을 합니다.

2. matplotlib 기초

지금까지 씨본으로 그릴 수 있는 기본적인 플롯들에 대해서 배웠습니다. 이번에는 matplotlib을 활용하여 간단하게 플롯을 스타일링하는 방법과 matplotlib 플롯의 구조에 대해 배워볼 것입니다.

2.1. 플롯 스타일

맷플롯은 여러 가지 플롯 스타일을 지원합니다. plt.style.available 속성을 통해서 사용 가능한 스타일들을 확인할 수 있습니다. 예를 들어 씨본 산점도를 R의 ggplot 스타일로 그리는 것도 가능합니다.

2.3. matplotlib 플롯의 구조

맷플롯립이 그려주는 하나의 figure는 위와 같이 분해할 수 있습니다. 우리가 여기서 다룰 구성요소들은 다음과 같습니다.

  • Figure: 하나의 플롯 객체, 하나 이상의 Axes를 포함할 수 있음
  • Axes: 개별 플롯
  • Title: 플롯 제목
  • X axis label,Y axis label: x,y 축 제목
  • Legend: 범례

피규어 생성: plt.figure()

plt.figure() 함수는 하나의 피규어를 생성하는 동시에, 피규어의 여러 속성을 지정할 수 있습니다. 주로 figsize 인자를 통해 피규어의 크기를 조정할 때 사용합니다. 가장 윗 줄에서 plt.figure 함수로 피규어를 생성한 후, 똑같이 씨본을 활용해서 플롯을 그려주면 됩니다.

인자 내용/기능
figsize (width,height) 형식으로 피규어의 크기를 지정합니다. 단위는 인치입니다.
facecolor 배경 색
edgecolor 테두리 색

플롯의 제목, XY라벨, 범례 수정하기

제목과 라벨, 범례를 다루기 전에 먼저 맷플롯에서 한글 폰트를 사용할 수 있도록 설정해주세요. 나눔글꼴을 설치하신 후, 맘에 드는 글꼴을 적용해주세요.제목, XY라벨, 범례를 수정하는 방법은 모두 비슷합니다. 플롯을 그리는 코드 다음에 제목과 라벨을 수정하는 코드를 추가해주면 됩니다.

Jeonghyun Gan, DataScience Lab